package ace.module.product.core.impl.manager.plugin;

import ace.cmp.core.model.R;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;

/**
 * 商品库存与销量插件管理者.
 *
 * @author Caspar
 *
 */
public interface PmsStockAndSalesQuantityPluginManager {

  /**
   * 扣减库存,增加销量.
   *
   * @param tenantId 租户id
   * @param userSn 用户操作流水单号
   * @param skuId sku id
   * @param quantity 扣减库存数量 大于0
   * @return code 0=成功   data=扣减操作记录id
   */
  R<Long> subtractStockAndAddSalesQuantity(long tenantId, @NotEmpty String userSn, long skuId, @Valid @NotNull @Positive Long quantity);

  /**
   * 扣减库存,增加销量.
   *
   * @param tenantId 租户id
   * @param skuId sku id
   * @param quantity 扣减库存数量 大于0
   * @return code 0=成功   data=扣减操作记录id
   */
  R<Long> subtractStockAndAddSalesQuantity(long tenantId, long skuId, @Valid @NotNull @Positive Long quantity);

  /**
   * 回退扣减库存与增加销量操作.
   *
   * @param tenantId 租户id
   * @param userSn 用户操作流水单号
   * @return code 0=成功   data=回退操作记录id
   */
  R<Long> reverseSubtractStockAndAddSalesQuantity(long tenantId, @NotEmpty String userSn);

  /**
   * 回退扣减库存与增加销量操作.
   *
   * @param tenantId 租户id
   * @param recordId 操作记录id
   * @return code 0=成功   data=回退操作记录id
   */
  R<Long> reverseSubtractStockAndAddSalesQuantity(long tenantId, @NotNull Long recordId);

}
